package cn.lichenfei.app.satoken.controller;

import cn.dev33.satoken.annotation.*;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;

@Slf4j
@Api(tags = "用户")
@RestController
@RequestMapping("user")
public class UserController {

    @ApiOperation(value = "登录")
    @GetMapping("doLogin")
    public SaResult doLogin(String username, String password) {
        // 此处仅作模拟示例，真实项目需要从数据库中查询数据进行比对
        if ("admin".equals(username) && "123456".equals(password)) {
            /**
             *     方法利用了 Cookie 自动注入的特性，省略了你手写返回 Token 的代码。
             *     Cookie 可以从后端控制往浏览器中写入 Token 值。
             *     Cookie 会在前端每次发起请求时自动提交 Token 值。
             */
            StpUtil.login(10001);
            return SaResult.data(StpUtil.getTokenInfo());
        }
        return SaResult.error("登录失败");
    }

    @ApiOperation("是否登录")
    @GetMapping("isLogin")
    public String isLogin() {
        return "当前会话是否登录：" + StpUtil.isLogin();
    }

    @ApiOperation("查询 Token 信息  ")
    @GetMapping("tokenInfo")
    public SaResult tokenInfo() {
        return SaResult.data(StpUtil.getTokenInfo());
    }

    @ApiOperation("测试注销")
    @GetMapping("logout")
    public SaResult logout() {
        StpUtil.logout();
        return SaResult.ok();
    }

    /**
     * 权限效验：
     * <p>
     * // 获取：当前账号所拥有的权限集合
     * StpUtil.getPermissionList();
     * <p>
     * // 判断：当前账号是否含有指定权限, 返回 true 或 false
     * StpUtil.hasPermission("user.add");
     * <p>
     * // 校验：当前账号是否含有指定权限, 如果验证未通过，则抛出异常: NotPermissionException
     * StpUtil.checkPermission("user.add");
     * <p>
     * // 校验：当前账号是否含有指定权限 [指定多个，必须全部验证通过]
     * StpUtil.checkPermissionAnd("user.add", "user.delete", "user.get");
     * <p>
     * // 校验：当前账号是否含有指定权限 [指定多个，只要其一验证通过即可]
     * StpUtil.checkPermissionOr("user.add", "user.delete", "user.get");
     * <p>
     * 角色效验：
     * <p>
     * // 获取：当前账号所拥有的角色集合
     * StpUtil.getRoleList();
     * <p>
     * // 判断：当前账号是否拥有指定角色, 返回 true 或 false
     * StpUtil.hasRole("super-admin");
     * <p>
     * // 校验：当前账号是否含有指定角色标识, 如果验证未通过，则抛出异常: NotRoleException
     * StpUtil.checkRole("super-admin");
     * <p>
     * // 校验：当前账号是否含有指定角色标识 [指定多个，必须全部验证通过]
     * StpUtil.checkRoleAnd("super-admin", "shop-admin");
     * <p>
     * // 校验：当前账号是否含有指定角色标识 [指定多个，只要其一验证通过即可]
     * StpUtil.checkRoleOr("super-admin", "shop-admin");
     */

    // 登录校验：只有登录之后才能进入该方法
    @SaCheckLogin
    @GetMapping("info")
    public String info() {
        return "查询用户信息";
    }

    // 角色校验：必须具有指定角色才能进入该方法
    @SaCheckRole("super-admin")
    @GetMapping("s-add")
    public String sadd() {
        return "用户增加";
    }

    // 权限校验：必须具有指定权限才能进入该方法
    @SaCheckPermission("user-add")
    @GetMapping("u-add")
    public String uadd() {
        return "用户增加";
    }

    // 校验当前账号是否被封禁 comment 服务，如果已被封禁会抛出异常，无法进入方法
    @SaCheckDisable("comment")
    @GetMapping("send")
    public String send() {
        return "查询用户信息";
    }

    @GetMapping("get/{id}")
    public String getById(@PathVariable("id") String id) {
        return "王麻子";
    }

    @DeleteMapping("/{id}")
    public void remove(@PathVariable("id") String id) {

    }

    @GetMapping(value = {"/{id}", "/my/{id}"})
    public void get(@PathVariable("id") String id) {

    }

    @RequestMapping(value = "requestMapping",method = RequestMethod.POST)
    public void requestMapping(){

    }

}
